Home Php C# Sql C C++ Javascript Python Java Go Android Git Linux Asp.net Django .net Node.js Ios Xcode Cocoa Iphone Mysql Tomcat Mongodb Bash Objective-c Scala Visual-studio Apache Elasticsearch Jar Eclipse Jquery Ruby-on-rails Ruby Rubygems Android-studio Spring Lua Sqlite Emacs Ubuntu Perl Docker Swift Amazon-web-services Svn Html Ajax Xml Java-ee Maven Intellij-idea Rvm Macos Unix Css Ipad Postgresql Css3 Json Windows-server Vue.js Typescript Oracle Hibernate Internet-explorer Github Tensorflow Laravel Symfony Redis Html5 Google-app-engine Nginx Firefox Sqlalchemy Lucene Erlang Flask Vim Solr Webview Facebook Zend-framework Virtualenv Nosql Ide Twitter Safari Flutter Bundle Phonegap Centos Sphinx Actionscript Tornado Register | Login | Edit Tags | New Questions | 繁体 | 简体


9 questions online user: 26

0
votes
answers
20 views
+10

我需要使用兩個表的CTE

1

我有2個表,我需要使用CTE。我需要使用兩個表的CTE

我需要行一組Table_2行從Table_1,這樣dActiveDate是最大的table_1,並??爲table_1.dcidKala = table_2.dcidKala

CREATE TABLE #Table_1 
(
    dcidKala    INT, 
    dcPercentDiscount  FLOAT, 
    dActiveDate   DATE 
) 

CREATE TABLE #Table_2 
(
    dcRow   INT, 
    dcidKala  INT, 
    dcNum   FLOAT, 
    dDateFactor  DATE 
) 

INSERT INTO #Table_1 
    (
    dcidKala, 
    dcPercentDiscount, 
    dActiveDate 
) 
VALUES 
(109,10,'2017-08-23'), 
(109, 15, '2017-10-12'), 
(100, 20, '2017-01-20'), 
(102, 20, '2017-01-20') 

INSERT INTO #Table_2 
    (
    dcRow, 
    dcidKala, 
    dcNum, 
    dDateFactor 
) 
VALUES 
(1,109,1, '2017-10-05' ), 
(2, 109, 2, '2017-10-07'), 
(3, 109, 1, '2017-10-14'), 
(4, 109, 5, '2017-10-19'), 
(5, 100, 2, '2017-01-25') 

;WITH cte AS 
(
    SELECT th.dcPercentDiscount, 
      tb.dcRow, 
      ROW_NUMBER() OVER(PARTITION BY th.dcidKala, tb.dcRow ORDER BY th.dActiveDate) AS 
      rn 
    FROM #Table_1 th 
      INNER JOIN #Table_2 tb 
       ON tb.dcidKala = th.dcidKala 
       AND tb.dDateFactor >= th.dActiveDate 
) 

SELECT * 
FROM #Table_2 t2 
     LEFT JOIN cte t3 
      ON t2.dcRow = t3.dcRow 
      AND t3.rn = 1 


DROP TABLE [#Table_1] 
DROP TABLE [#Table_2] 

--result myCode is: 
    --1 109 1 2017-10-05 10 1 1 
    --2 109 2 2017-10-07 10 2 1 
    --3 109 1 2017-10-14 10 3 1 
    --4 109 5 2017-10-19 10 4 1 
    --5 100 2 2017-01-25 20 5 1 

    --Rows 3 and Rows 4 is wrong 

    --i need this result : 
    -- on Result From table_1 on table_2 
    --1 109 1 2017-10-05 10 1 1 
    --2 109 2 2017-10-07 10 2 1 
    --3 109 1 2017-10-14 15 3 1 
    --4 109 5 2017-10-19 15 4 1 
    --5 100 2 2017-01-25 20 5 1 

對於TABLE_2從TABLE_1只是一個結果,每一行是最大的 dActiveDate小dDateFactor

請幫我

謝謝

+0

您正在使用哪種[DBMS](https://en.wikipedia.org/wiki/DBMS)產品? Postgres的?甲骨文? 「_SQL_」只是一種查詢語言,而不是特定數據庫產品的名稱。 –

沙发
0
1

您可以使用此。

;WITH cte AS 
(
    SELECT 
     th.dcPercentDiscount, tb.dcRow, 
     ROW_NUMBER() OVER(PARTITION BY th.dcidKala, tb.dcRow ORDER BY th.dActiveDate DESC) AS rn 
    FROM 
     Table_1 th 
    INNER JOIN 
     Table_2 tb ON tb.dcidKala = th.dcidKala 
        AND tb.dDateFactor >= th.dActiveDate 
) 
SELECT * 
FROM Table_2 t2 
LEFT JOIN cte t3 ON t2.dcRow = t3.dcRow and t3.rn=1 
+0

謝謝你的回覆 我測試你的代碼與差異數據和不幸的是錯誤的.... 你能編輯它嗎?sarslan? –

+0

你能分享你的不同數據嗎? –

+0

我做了更新。 –

板凳
0
1
CREATE TABLE #Table_1 (dcidKala   INT, 
         dcPercentDiscount FLOAT, 
         dActiveDate  DATE) 

CREATE TABLE #Table_2 (dcRow  INT, 
         dcidKala INT, 
         dcNum  FLOAT, 
         dDateFactor DATE) 

INSERT INTO #Table_1 (dcidKala, 
         dcPercentDiscount, 
         dActiveDate) 
VALUES (100, 10, '2017-01-01'), 
(101, 15, '2017-01-02'), 
(100, 20, '2017-01-20'), 
(102, 20, '2017-01-20') 

INSERT INTO #Table_2 (dcRow, 
         dcidKala, 
         dcNum, 
         dDateFactor) 
VALUES (1, 100, 1, '2017-01-05'), 
(2, 100, 2, '2017-01-09'), 
(3, 101, 1, '2017-01-01'), 
(4, 101, 5, '2017-01-20'), 
(5, 100, 2, '2017-01-25') 

SELECT * 
FROM [#Table_2] AS [t2] 
CROSS APPLY ( SELECT TOP 1 * 
       FROM ( SELECT TOP 1 [t1].[dcidKala], 
            [t1].[dcPercentDiscount], 
            [t1].[dActiveDate] 
          FROM [#Table_1] AS [t1] 
          WHERE [t1].[dcidKala] = [t2].[dcidKala] 
            AND [t2].[dDateFactor] >= [t1].[dActiveDate] 
          ORDER BY [t1].[dActiveDate] DESC 
          UNION ALL 
          SELECT NULL, 
            NULL, 
            NULL) t3 
       ORDER BY CASE 
          WHEN [t2].[dcidKala] IS NOT NULL THEN 0 
          ELSE 1 
         END) AS t1 

DROP TABLE [#Table_1] 
DROP TABLE [#Table_2] 
0
votes
answers
7 views
+10

如何使用AND運算

0

,因爲我很新的使用這個組合兩個正則表達式我有一個兩難的使用正則表達式:如何使用AND運算

我有下面的網址:

var url = https://website.com/something-here/page.html?p=null#confirmation?order=123 

我期望的結果是:

/something-here/page.html #confirmation 

這可能是一個空格或逗號或簡單地將二者結合起來(/something-here/page.html#confirmation)

我可以做到這一點使用兩個正則表達式如下:

var a= url.match(/som([^#]+).html/)[0]; 

var b= url.match(/#([^#]+).tion/)[0]; 

console.log(a,b); 

但我想它作爲具有相同結果的單正則表達式來完成。

我希望你能幫助我。它驅使我瘋狂尋找答案。 。:(

感謝

+1

爲什麼一個正則表達式,如果兩個正則表達式你需要什麼? – Teemu

+0

1.你的最終目標是你的正則表達式的目的是什麼?使用。 2.這是什麼空間? –

+0

我想嘗試將它們結合起來,或者至少創建一個單一的regEx作爲我試圖創建的表單上的一個字段* should *只接受單線程正則表達式。 :( 我試過這種格式^(?=。* some)(?=。*#)但它不起作用 空間只是分開兩個,但它並不是一個真正的因素。他們可以用逗號連在一起,也可以合併爲一個單詞。 –

沙发
0
-1

使用範圍每個條件「()」的更多細節回答嘗試找到here

板凳
0
0

您可以使用正則表達式的集羣系統,你的優勢在這裏是一個片段:

var matches = url.match(/(som[^#]+.html).*?(#[^#]+.tion)/); 
console.log(matches[1] + " " + matches[2]); // prints /something-here/page.html #confirmation 

我將兩個RegExp條件組合成一個,同時用正確的區域括起來創建兩個組。這樣,您可以獲取指定的組並在其間添加空間。

+0

你好@Tals,我試圖運行它,但由於數組匹配,它給了我一個意想不到的錯誤。當我刪除它們時,它給了我一個空值。 我也試圖用[0]和[1]分別替換值,但仍然會出現相同的意外錯誤。 感謝您的建議。 :) –

+1

嗨Tals, 它的一個錯誤在我的最後,我正在運行它在另一張表,我用於測試哈哈。我很抱歉。這是正確的和正在運行。 –

+0

酷!祝你好運:) – Tals

地板
0
0

除了一個事實,即你的例子URL是錯誤的(你有兩個搜索PARAMS),因此不太適合一起工作 - 我擁有電子命題:

爲什麼不使用URL對象及其屬性?

url = new URL("https://website.com/something-here/page.html?p=null#confirmation?order=123"); 

,準確地抓住具有明確的語法屬性,如:

url.pathname;>> 「的東西,在這裏/ page.html中」

url.hash;>>「#confirmation訂單? = 123「

但是如果你明確的ne編一個RegExp變種

這裏是一個

var url = "https://website.com/something-here/page.html?p=null#confirmation?order=123"; 
 
var match = url.match(//som.*?html|#.*?tion/g); 
 

 
console.log(match.join(" "));

+0

嗨,Bekim,非常感謝你。我能夠運行它,現在它可以工作。非常感謝你的幫助!^_^ –

+0

@LeaSanchez太好了,(現在你應該把線程標記爲已解決,例如接受最適合你的答案)。 :) –

0
votes
answers
13 views
+10

通過表達式檢索嵌套的PropertyInfo

1

我試圖創建一個函數,我可以在表達式中傳遞我感興趣的屬性。我讓它爲頂級屬性工作,但不適用於嵌套屬性。通過表達式檢索嵌套的PropertyInfo

例模型

public class Foo { 
    public string Name { get; set; } 
    public List<Foo> List { get; set; } 
} 

我有什麼到目前爲止

private PropertyInfo GetPropertyInfo<TModel>(Expression<Func<TModel, object>> selector) 
    { 
     if (selector.NodeType != ExpressionType.Lambda) 
     { 
      throw new ArgumentException("Selector must be lambda expression", nameof(selector)); 
     } 

     var lambda = (LambdaExpression)selector; 

     var memberExpression = ExtractMemberExpression(lambda.Body); 
     if (memberExpression == null) 
      throw new ArgumentException("Selector must be member access expression", nameof(selector)); 

     if (memberExpression.Member.DeclaringType == null) 
     { 
      throw new InvalidOperationException("Property does not have declaring type"); 
     } 

     return memberExpression.Member.DeclaringType.GetProperty(memberExpression.Member.Name); 
    } 

    private static MemberExpression ExtractMemberExpression(Expression expression) 
    { 
     if (expression.NodeType == ExpressionType.MemberAccess) 
     { 
      return ((MemberExpression)expression); 
     } 

     if (expression.NodeType == ExpressionType.Convert) 
     { 
      var operand = ((UnaryExpression)expression).Operand; 
      return ExtractMemberExpression(operand); 
     } 

     return null; 
    } 

所以:

GetPropertyInfo<Foo>(x => x.Name); // works 
GetPropertyInfo<Foo>(x => x.List.Select(y => y.Name); <-- how do I get this? 

我正在尋找一種方法可以選擇任何財產從一個複雜的對象。

沙发
0
2

您需要擴展ExtractMemberExpression只是有點接受Select調用表達式:

private MemberExpression ExtractMemberExpression(Expression expression) { 
    if (expression.NodeType == ExpressionType.MemberAccess) { 
     return ((MemberExpression) expression); 
    } 

    if (expression.NodeType == ExpressionType.Convert) { 
     var operand = ((UnaryExpression) expression).Operand; 
     return ExtractMemberExpression(operand); 
    } 
    if (expression.NodeType == ExpressionType.Lambda) {    
     return ExtractMemberExpression(((LambdaExpression) expression).Body); 
    } 

    if (expression.NodeType == ExpressionType.Call) { 
     var call = (MethodCallExpression) expression; 
     // any method named Select with 2 parameters will do 
     if (call.Method.Name == "Select" && call.Arguments.Count == 2) { 
      return ExtractMemberExpression(call.Arguments[1]); 
     } 
    } 

    return null; 
} 
+0

真棒,謝謝 – Magpie

0
votes
answers
21 views
+10

X和Y不相關,但Y是Xin隨機森林分類器的預測。如何使用統計和機器學習來表示這一點?

-1

X和Y是不相關的(0.3);然而,當我把X在隨機森林分類預測Y,旁邊兩(A,B)其他(相關)變量,X和兩個其他變量(A,B)爲Y.注意的顯著預測的是,其他兩個(A, B)變量也無法與Y. 相關怎樣才能根據統計和機器學習的想法解釋這一點。X和Y不相關,但Y是Xin隨機森林分類器的預測。如何使用統計和機器學習來表示這一點?

代表一個或多個可變(A或B或Y)相對於另一變量(X),其中變量不具有很強的相關性。

+0

發現這可能是https://stats.stackexchange.com/一個更好的問題 – Pace

沙发
0
0

相關性是線性的。如果存在非線性關係,則可能看不到相關性。

隨機森林(決策樹是非線性的),所以你能預測發現一個隨機森林,即使相關性爲零。

A quadratic function could have zero correlation between X and Y

對相關

該圖像,更可以在 https://www.statisticalengineering.com/correlation.htm

0
votes
answers
26 views
+10

用於解析JSON文件的遞歸CTE

0

我正在使用SQL Server 2014解析JSON文件,爲此我認爲遞歸CTE很方便。用於解析JSON文件的遞歸CTE

的JSON文件是這樣的:

{ 
    "0": { 
    "SalesOrderNumber": "CSVSO67695", 
    "SalesOrderDetailID": 97971, 
    "OrderDate": "2014-03-05 00:00:00.000", 
    "ProductNumber": "WB-H098", 
    "Quantity": 1, 
    "LineTotal": 4.99, 
    "CustomerType": "Individual", 
    "TestData_1": "Sales extract OK!", 
    "TestData_2": 255 
    }, 
    "1": { 
    "SalesOrderNumber": "CSVSO53485", 
    "SalesOrderDetailID": 47747, 
    "OrderDate": "2013-07-31 00:00:00.000", 
    "ProductNumber": "SJ-0194-L", 
    "Quantity": 10, 
    "LineTotal": 323.94, 
    "CustomerType": "Store", 
    "TestData_1": "Sales extract OK!", 
    "TestData_2": 255 
    }, 
    "2": { 
    "SalesOrderNumber": "CSVSO52248", 
    "SalesOrderDetailID": 43809, 
    "OrderDate": "2013-07-07 00:00:00.000", 
    "ProductNumber": "TT-M928", 
    "Quantity": 1, 
    "LineTotal": 4.99, 
    "CustomerType": "Individual", 
    "TestData_1": "Sales extract OK!", 
    "TestData_2": 255 
    } 

}

誰能幫助我?

+0

也許你可以提供您所需的輸出模式?價值是關鍵嗎?此外,請指出代碼是否需要專門在此JSON模式或各種類型上執行。 – MarkD

+0

[在TSQL中解析JSON]的可能重複(https://stackoverflow.com/questions/2867501/parse-json-in-tsql) – MarkD

沙发
0
0

你不需要爲此遞歸。搶delimitedSplit8K副本,並做到這一點:

declare @json varchar(8000) = 
'{ 
"0": { 
"SalesOrderNumber": "CSVSO67695", 
"SalesOrderDetailID": 97971, 
"OrderDate": "2014-03-05 00:00:00.000", 
"ProductNumber": "WB-H098", 
"Quantity": 1, 
"LineTotal": 4.99, 
"CustomerType": "Individual", 
"TestData_1": "Sales extract OK!", 
"TestData_2": 255 
}, 
"1": { 
"SalesOrderNumber": "CSVSO53485", 
"SalesOrderDetailID": 47747, 
"OrderDate": "2013-07-31 00:00:00.000", 
"ProductNumber": "SJ-0194-L", 
"Quantity": 10, 
"LineTotal": 323.94, 
"CustomerType": "Store", 
"TestData_1": "Sales extract OK!", 
"TestData_2": 255 
}, 
"2": { 
"SalesOrderNumber": "CSVSO52248", 
"SalesOrderDetailID": 43809, 
"OrderDate": "2013-07-07 00:00:00.000", 
"ProductNumber": "TT-M928", 
"Quantity": 1, 
"LineTotal": 4.99, 
"CustomerType": "Individual", 
"TestData_1": "Sales extract OK!", 
"TestData_2": 255 
    } 
}'; 

select 
    jsonItemId, 
    item, 
    attrib, 
    attribValue 
from 
(
    select 
    jsonItemId = sum(sign(jsonItemIdPrep)) over (order by itemnumber), 
    ItemNumber, 
    item, 
    attrib  = ltrim(replace(substring(item, 1, sep.pos-1),'"','')), 
    attribValue = replace(ltrim(replace(substring(item, sep.pos+1, len(item)),'"','')),',',''), 
    jsonItemIdPrep 
    from 
    (
    select ItemNumber, item, jsonItemIdPrep = 
     case 
     when item like '%"[0-9]": {%' 
      or item like '%"[0-9][0-9]": {%' 
      or item like '%"[0-9][0-9][0-9]": {%' -- 1,2 or 3 digits 
     then substring(item, v.ps, charindex('"', item, v.ps)- v.ps) 
     end 
    from dbo.DelimitedSplit8K(replace(@json,char(10),''), char(13)) 
    cross apply (values (charindex('"',item)+1)) v(ps) 
    where ItemNumber > 1 and item not like '%}' and item not like '%},' 
) x 
    cross apply (values (charindex(':', item))) sep(pos) 
    cross apply (values (replace(substring(item, 1, sep.pos-1),'"',''))) p(xxx) 
) x 
where jsonItemIdPrep is null; 

結果

jsonItemId item             attrib      attribValue 
----------- ----------------------------------------------------- ----------------------------- ----------------------------------- 
0   "SalesOrderNumber": "CSVSO67695",     SalesOrderNumber    CSVSO67695 
0   "SalesOrderDetailID": 97971,      SalesOrderDetailID   97971 
0   "OrderDate": "2014-03-05 00:00:00.000",   OrderDate      2014-03-05 00:00:00.000 
0   "ProductNumber": "WB-H098",      ProductNumber     WB-H098 
0   "Quantity": 1,         Quantity      1 
0   "LineTotal": 4.99,        LineTotal      4.99 
0   "CustomerType": "Individual",      CustomerType     Individual 
0   "TestData_1": "Sales extract OK!",    TestData_1     Sales extract OK! 
0   "TestData_2": 255         TestData_2     255 
1   "SalesOrderNumber": "CSVSO53485",     SalesOrderNumber    CSVSO53485 
1   "SalesOrderDetailID": 47747,      SalesOrderDetailID   47747 
1   "OrderDate": "2013-07-31 00:00:00.000",   OrderDate      2013-07-31 00:00:00.000 
1   "ProductNumber": "SJ-0194-L",      ProductNumber     SJ-0194-L 
1   "Quantity": 10,         Quantity      10 
1   "LineTotal": 323.94,        LineTotal      323.94 
1   "CustomerType": "Store",       CustomerType     Store 
1   "TestData_1": "Sales extract OK!",    TestData_1     Sales extract OK! 
1   "TestData_2": 255         TestData_2     255 
2   "SalesOrderNumber": "CSVSO52248",     SalesOrderNumber    CSVSO52248 
2   "SalesOrderDetailID": 43809,      SalesOrderDetailID   43809 
2   "OrderDate": "2013-07-07 00:00:00.000",   OrderDate      2013-07-07 00:00:00.000 
2   "ProductNumber": "TT-M928",      ProductNumber     TT-M928 
2   "Quantity": 1,         Quantity      1 
2   "LineTotal": 4.99,        LineTotal      4.99 
2   "CustomerType": "Individual",      CustomerType     Individual 
2   "TestData_1": "Sales extract OK!",    TestData_1     Sales extract OK! 
2   "TestData_2": 255         TestData_2     255 
0
votes
answers
21 views
+10

表達對創建的泛型類型參數

3

我試圖建立一個表達式與泛型類型參數個數可變創建通用Tuple<>實例變量數量的元組。表達對創建的泛型類型參數

生成的Tuple<>實例的想法是基於其上具有KeyAttribute的屬性爲實體類型動態創建組合鍵值。然後組合鍵將被用作Dictionary<object, TEntity>中的鍵。所以lambda表達式應該建立一定的實體類型和拉姆達會被調用,傳遞的TEntity一個實例來取回一個Tuple<>形式的組合鍵。

例實體模型

public class MyEntityModel 
{ 
    [Key] 
    public string Key1 { get; set; } 
    [Key] 
    public Guid Key2 { get; set; } 
    public int OtherProperty { get; set; } 
} 

表達什麼應該做

public Func<MyEntityModel, object> BuildKeyFactory() 
{ 
    // This is how the LambdaExpression should look like, but then for a generic entity type instead of fixed to MyEntityModel 
    return new Func<MyEntityModel, object>(entity => new Tuple<string, Guid>(entity.Key1, entity.Key2)); 
} 

但當然的實體模型需要一個泛型類型。

我有什麼到目前爲止

public Func<TEntity, object> BuildKeyFactory<TEntity>() 
{ 
    var entityType = typeof(TEntity); 

    // Get properties that have the [Key] attribute 
    var keyProperties = entityType.GetProperties(BindingFlags.Instance | BindingFlags.Public) 
     .Where(x => x.GetCustomAttribute(typeof(KeyAttribute)) != null) 
     .ToArray(); 

    var tupleType = Type.GetType($"System.Tuple`{keyProperties.Length}"); 
    if (tupleType == null) throw new InvalidOperationException($"No tuple type found for {keyProperties.Length} generic arguments"); 

    var keyPropertyTypes = keyProperties.Select(x => x.PropertyType).ToArray(); 
    var tupleConstructor = tupleType.MakeGenericType(keyPropertyTypes).GetConstructor(keyPropertyTypes); 
    if (tupleConstructor == null) throw new InvalidOperationException($"No tuple constructor found for key in {entityType.Name} entity"); 

    // The following part is where I need some help with... 
    var newTupleExpression = Expression.New(tupleConstructor, keyProperties.Select(x => ????)); 

    return Expression.Lambda<Func<TEntity, object>>(????).Compile(); 
} 

正如你所看到的,我無法弄清楚如何我需要爲傳遞給Expression.New()調用(可能是一些與Expression.MakeMemberAccess(Expression.Property())創建屬性表達式,但不知道如何從lambda參數中傳遞TEntity實例),以及如何通過Expression.Lambda調用將其鏈接起來。任何幫助將不勝感激!

沙发
0
3

你是相當接近。

// we need to build entity => new Tuple<..>(entity.Property1, entity.Property2...) 
// arg represents "entity" above 
var arg = Expression.Parameter(typeof(TEntity)); 
// The following part is where I need some help with... 
// Expression.Property(arg, "name) represents "entity.Property1" above 
var newTupleExpression = Expression.New(tupleConstructor, keyProperties.Select(c => Expression.Property(arg, c))); 
return Expression.Lambda<Func<TEntity, object>>(newTupleExpression, arg).Compile(); 
0
votes
answers
8 views
+10

過濾但屬性和子實體屬性

1

我爲構建搜索邏輯的動態表達式樹遇到了一個小問題。爲實體自己的屬性創建一個表達式樹工作正常,但我不知道如何添加一個表達式,它將按照子實體屬性進行過濾。過濾但屬性和子實體屬性

這是我的任務實體:

public class Task: Entity 
{ 
    public TaskType Type { get; set; } 
    public TaskPriority Priority { get; set; } 
    public int ProjectId { get; set; } 
    public Project Project { get; set; } 
} 

這裏是項目實體:

public class Project: Entity 
{   
    public int CustomerId { get; set; } 
    public Customer Customer { get; set; } 
} 

和邏輯構建動態表達:

public Func<TaskItem, bool> Build(IList<Filter> filters) 
{ 
    ParameterExpression param = Expression.Parameter(typeof(TaskItem), "task"); 
    List<Filter> priorityFilter = FilterFilters(filters, "Priority"); 
    List<Filter> typeFilter = FilterFilters(filters, "Type"); 
    List<Filter> customerFilter = FilterFilters(filters, "CustomerId"); 

    Expression expression = null; 

    // BuildExpression is a method which simply creates expression which is using Tasks properties (like Type or Priority) 
    expression = BuildExpression(param, priorityFilter, expression); 
    expression = BuildExpression(param, typeFilter, expression); 

    // This part need's to be reworked 
    ParameterExpression projectParam = Expression.Parameter(typeof(Project), "project"); 
    Expression projectCustomerExpression = Expression.Equal(Expression.PropertyOrField(projectParam, "CustomerId"), Expression.Constant(customerFilter[0].Value)); 
    Expression customerExpression = Expression.Equal(Expression.PropertyOrField(param, "Project"), projectCustomerExpression); 
    Expression finall = expression != null ? Expression.AndAlso(expression, projectCustomerExpression) : projectCustomerExpression;   
    // End of filtering by CutomerId 

    return Expression.Lambda<Func<TaskItem, bool>>(finall, param).Compile(); 
} 

我不知道怎麼樣通過CustomerId進行過濾。上面代碼標記爲This part need's to be reworked的部分可能是錯誤的,或者至少是其最後部分。這個想法是擴展現有的表達式(這個由BuildExpression方法構建的表達式)和一個將由CustomerId過濾的表達式。

我已經在這方面失去了一些時間,嘗試自己尋找答案,但沒有結果。

任何幫助?

沙发
0
2

由於您提供了最少的代碼,因此如何創建實際表達式是未知的。所以,我會嘗試爲這種情況提供一個通用配方。

如果你想過濾的Task列表,那麼你仍然需要使用Task類型相同??,就像你已經這樣做:

ParameterExpression param = Expression.Parameter(typeof(TaskItem), "task"); 

沒有必要創建Project類型的其他??即使您想過濾Project的屬性。相反,你只需要重用前者??。需要注意的是,如果我們建立一個靜態謂詞像下面,這也是我們也不使用不同的參數表達的情況:

queryableTask.Where(t => t.Priority == TaskPriority.High && t.Project.CustomerId == 123); 

我們動態地建立在導航(子)屬性篩選,關鍵是以正確形成左表達式(即導航屬性的表達式)。

可以說我們的導航屬性是用點符號表示的:Project.CustomerId。然後,我們可以做這樣的事情,以創建左表達財產:

// We already have the following commented properties 
// prop = "Project.CustomerId"; 
// ParameterExpression param = Expression.Parameter(typeof(TaskItem), "task"); 
var leftExpr = prop.Split('.') 
        .Aggregate<string, MemberExpression>(null, 
         (acc, p) => acc == null 
          ? Expression.Property(param, p) 
          : Expression.Property(acc, p)); 

然後你就可以做其他像一個正常的特性,例如創建正確表達,並將其與另一種表達結合定義運算符(等於,不等於等)。

希望這會有所幫助。

+0

謝謝 - 你救了我的一天!但是當我像這樣調用ToList()時,我得到「對象引用未設置爲對象的實例」:'Context.Tasks.Where(searchCondition).ToList()'(搜索條件包含表達它是'IQueryable ')。堆棧跟蹤:在System.Linq.Enumerable的System.Linq.Enumerable.WhereEnumerableIterator1.ToList()處的lambda_method(Closure,Task)處。ToList [TSource](IEnumerable1 source)'。 任何想法? –

+1

@DawidRutkowski很可能'Project'是'null'。如果你想填充'IQueryable ',你最好改變方法簽名來返回'Expression >'並移除'Compile()'調用。目前,即使您的源代碼是'IQueryable ',編譯器也會調用'IEnumerable '上的Where'方法。 –

+1

@DawidRutkowski雖然我不確定,但是可能的原因會像@IvanStoev指出的那樣。如果你在'searchCondition'上使用'.Compile',那麼你不必這樣做,除非你想避免延遲加載。相反,您可以直接將'searchCondition'應用於'IQueryable'數據,然後'ToList'來枚舉。如果這不起作用,那麼可以嘗試包括導航屬性路徑(不包括路徑中的最後一個屬性;即簡單類型的實際屬性)以強制連接。 –

0
votes
answers
10 views
+10

字符串中最後2個括號之間的所有大寫字母的正則表達式

1

我試圖獲取字符串中最後2個括號之間的所有大寫字母。到目前爲止,我已經試過這樣:字符串中最後2個括號之間的所有大寫字母的正則表達式

/(([A-Z])([^)]*))[^(]*$/g 

。例如:我不希望(這些詞),我想(這兩個)

,但它給了我:

組1 。T

集團2 hese Two

有人能幫助我嗎?

在此先感謝!

+0

所以,你希望所有的信件,不只是大寫字母?你想要什麼答案? – NetMage

+0

如果你得到最後一個左括號的索引,然後得到最後一個右括號的索引,並得到這些索引之間的子串,*然後*得到大寫字母,那麼維護會更容易。即使你的正則表達式工作正常,你也無法在幾個月內理解這個正則表達式。 – Amy

+0

您的字符串可以有多組圓括號嗎?是否有錯誤的情況下有不匹配的括號?或者,總是隻有兩個你必須處理和沒有錯誤條件? – Highdown

沙发
0
2

我認爲,最短,最簡單的解決方法是:

  • (?!.*() - 負前瞻 - 無處以後會出現的任何 左括號(之後的任何數量的其他字符),
  • (?=.*)) - 積極的前瞻 - 某處稍後必須 出現右括號(任意數量的其他字符之後),
  • [A-Z] - 抓住一個大寫字母,而不是作爲一個捕獲組, 但作爲一個「正常」的比賽,
  • g - 隨着全球選項。

綜上所述:

/(?!.*()(?=.*))[A-Z]/g 
板凳
0
0

你可以在JavaScript中括號內包裝爲後續的最後一個字符串之間的所有字母大寫:

/(?!.*()(?=.*))([A-Z])/g 

其中第一部分(?!.*(.*))是忽略所有的開括號後立即停止負前瞻最後一個。然後,我們執行一個正面預測,它匹配所有內容,直到遇到關閉的括號。然後我們匹配大寫字母。

地板
0
0

代碼

var s = "I don't want (These Words), I want (These Two)" 
 
var r = /.*(([^)]*))/ 
 
var m = r.exec(s) 
 

 
console.log(m[1].match(/[A-Z]/g))


說明

一正則表達式

第一個正則表達式.*(([^)]*)).*提取的最後一個括號中的內容。

  • .*匹配任何字符任意次數
  • (匹配左括號字面上
  • ([^)]*)捕捉除右括號的任何字符的任何數量的次進入捕獲組1
  • )匹配右括號字面上
  • .*匹配任何字符的次數

二正則表達式

第二個正則表達式[A-Z]匹配大寫字母

+0

謝謝,但沒有辦法在一個表達式中做到這一點? s.match(/.* (([^)] *))。* /)[1] .match(/ [AZ]/g).join('') 可以工作,如果我可以把它放在1個正則表達式中,d會更好 –

+0

@TimVN爲什麼人們總是這樣問?哈哈......當你談論可變長度元素的可能性時,它不是JavaScript。如果你總是有2個單詞,你可以使用'。* (([AZ])[^ AZ]([AZ])'獲得第一個和第二個捕獲組,但是當你增加這個可能性時, ([AZ])(?:[^ AZ]([AZ]))? - > 1或2,'。* (([AZ])或更少,您的表情變得非常複雜:'。* (?:[^ AZ]([AZ]))?(?:[^ AZ]([AZ]))?' - > 1,2或3等 – ctwheels

+0

@TimVN在其他正則表達式引擎中, 。JavaScript的正則表達式支持並不是很棒,例如,PCRE允許' G'和' K'這使得這非常容易:['(?:。* (| G(?! A))[^AZ] * K [AZ]'](https://regex101.com/r/9e2GLA/1/),但這些在JavaScript中不可用,您可以在沒有' K'的情況下這樣做:[' (?:。* (| G(?! A))[^ AZ] *([AZ])'](https://regex101.com/r/9e2GLA/2),但又是' G '不支持在JavaScript中 – ctwheels

0
votes
answers
17 views
+10

如何僅使用數學函數/表達式實現最大條件?

-3

它可以是任何編程語言。如何僅使用數學函數/表達式實現最大條件?

例如在PHP中:

if($x > 2) { $x=2; } 

有沒有辦法不使用的情況,但使用一些數學表達式來達到同樣的結果呢?

+3

定義「數學表達」。 –

+0

如果您只是在尋找無分支解決方案,請檢查PHP是否有'min()'函數:'$ x = min($ x,2);' – njuffa

沙发
0
0

我找到答案

$maxval = 2; 

$x = $maxval - (abs($maxval - $x) + $maxval - $x)/2; 

所以如果$ X> $ MAXVAL,該表達式(ABS($ MAXVAL - $ X)+ $ MAXVAL - $ X)/ 2;變爲0,$ x變成等於$ MAXVAL 否則這個表達式等於$ MAXVAL - $ x和整個方程變爲 $ X = $ X

但最短溶液是

$x = min($x, 2);