Tag: linq

为什么我不能从扩展类型的基类调用扩展方法?

我正在尝试通过覆盖索引器来添加查找List<KeyValuePair>的元素的function。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication2 { public class MyList : List<KeyValuePair> { public int this[string key] { get { return base.Single(item => item.Key == key).Value; } } } } 由于某种原因,编译器抛出此错误: ‘ System.Collections.Generic.List<System.Collections.Generic.KeyValuePair> ‘不包含’ Single ‘的定义。 虽然List确实没有该方法,但它应该是可见的,因为它是System.Linq命名空间(包含在内)中的扩展方法。 显然使用this.Single解决了这个问题,但为什么通过base访问是一个错误? C#规范第7.6.8节说 当base.I出现在类或结构中时, I必须表示该类或结构的基类的成员。 这似乎阻止了通过base访问扩展方法。 不过它也说 在绑定时, base.I和base[E]forms的基本访问表达式的计算方式与它们的编写完全相同((B)this).I和((B)this)[E] ,其中B是构造发生的类或结构的基类。 因此, base.I和base[E]对应于this.I和this[E] […]

按字符串生成EF orderby Expression

我想通过字符串参数生成表达式,一些代码如: private Expression<Func> Generate(string orderby) { switch (orderby) { case “Time”: return t => t.Time; case “Money”: return t => t.RewardMoney; default: return t => t.Id; } } 然后叫它: _context.Items.OrderBy(Generate(“Money”)); 但它无法编译! 我将T改为对象。 private Expression<Func> Generate(string orderby) 然后它可以编译,但它不起作用。 System.NotSupportedException:无法将类型“System.Int32”强制转换为“System.Object”类型。 LINQ to Entities仅支持转换EDM原语或枚举类型。

局部变量和表达式树

我正在学习C#中的表达式树。 我现在被困了一段时间: string filterString = “ruby”; Expression<Func> expression = x => x == filterString; 如何通过代码构造此表达式? 没有示例如何捕获局部变量。 这个很简单: Expression<Func> expression = x => x == “ruby”; 这将是: ParameterExpression stringParam = Expression.Parameter(typeof(string), “x”); Expression constant = Expression.Constant(“ruby”); BinaryExpression equals = Expression.Equal(stringParam, constant); Expression<Func> lambda1 = Expression.Lambda<Func>( equals, new ParameterExpression[] { stringParam }); 调试器为(x => x == filterString)打印以下内容: […]

LINQ:使用INNER JOIN,Group和SUM

我正在尝试使用LINQ执行以下SQL,而我最接近的是进行交叉连接和求和计算。 我知道必须有一个更好的方法来编写它,所以我转向堆栈团队寻求帮助。 SELECT T1.Column1, T1.Column2, SUM(T3.Column1) AS Amount FROM T1 INNER JOIN T2 ON T1.T1ID = T2.T1ID INNER JOIN T3 ON T2.T3ID = T3.T3ID GROUP BY T1.Column1, T1.Column2 我一直在尝试的是以下LINQ代码 var qTotal = from T2 in context.T2 from T3 in context.T3 where T3.T3ID == T3.T3ID group T3 by T2.T1ID into gT2T3 from T1 in context.T1 where […]

VS2015的即时窗口中的lambda表达式

我正在运行Visual Studio 2015, 人们声称在即时窗口,手表和其他地方支持lambda表达式。 但这对我不起作用。 我使用以下代码创建了一个新的控制台应用程序: static void Main(string[] args) { var list = new List {1, 2, 3, 4, 5, 6, 7}; } 然后在即时窗口中尝试一些简单的lambdas并观察,如下所示: 正如你所看到的,它给了我“表达式不能包含lambda表达式”。 我查看了工具 – >选项 – >调试设置但找不到与问题相关的任何内容。 我运行的版本是VS2015 Enterprise,14.0.24720.00 Update 1可能导致此问题的原因是什么?

在LINQ中获取结果函数而不转换为存储表达式

我需要从一个需要在LINQ查询中运行的函数中获取结果。 这个结果绑定到网格但在运行时遇到这个错误: LINQ to Entities无法识别方法’System.String GetName(System.Type,System.Object)’方法,并且此方法无法转换为商店表达式。 这是我的代码: public IQueryable GetForRah_CapacityList(XQueryParam param) { var result = (from x in Data() select new { Rah_CapacityId = x.Rah_CapacityId, Rah_CapacityName = x.Rah_CapacityName, Rah_St = Enum.GetName(typeof(Domain.Enums.CapacityState), x.Rah_St), Rah_LinesId = x.Rah_LinesId }).OrderByDescending(o => new { o.Rah_CapacityId }); return result; }

Linq“无法将表达式转换为SQL,无法将其视为本地表达式。”

我从这个问题开始,我在那里回答,现在我在这里问更基本的问题。 我已将查询简化为: var q = from ent in LinqUtils.GetTable() from tel in ent.Telephones.DefaultIfEmpty() select new { Name = ent.FormattedName, Tel = tel != null ? tel.FormattedNumber : “” // this is what causes the error }; tel.FormattedNumber是一个将Number和Extension字段组合成一个整齐格式化的字符串的属性。 这是导致的错误: System.InvalidOperationException: Could not translate expression ‘Table(Entity).SelectMany(ent => ent.Telephones.DefaultIfEmpty(), (ent, tel) => new f__AnonymousType0`2(Name = ent.FormattedName, Tel = […]

使用LINQ将多个列表合并到一个列表中

有没有一种灵活的方法可以使用LINQ将多个列表合并到一个列表中以有效地复制它? public class RGB { public int Red { get; set; } public int Green { get; set; } public int Blue { get; set; } public RGB(int red, int green, int blue) { Red = red; Green = green; Blue = blue; } } public void myFunction() { List red = new List { […]

使用LINQ进行配对设置

当我有一个清单 IList list = new List(); list.Add(100); list.Add(200); list.Add(300); list.Add(400); list.Add(500); 提取对的方法是什么 Example : List elements {100,200,300,400,500} Expected Pair : { {100,200} ,{200,300} ,{300,400} ,{400,500} }

在LINQ中进行字符串比较的问题

我无法让LINQ将某些内容翻译成我需要的查询。 在T-SQL中,我们对作为CHAR(6)列的三列进行 =比较。 LINQ不允许我这样做 运算符'<='不能应用于'string'类型的操作数为'string'。 我有以下T-SQL查询.. SELECT * FROM [ZIPMASTER] zm WHERE zm.CORP = 12 AND ‘85546 ‘ BETWEEN zm.ZIPBEG AND zm.ZIPEND 由于不支持BETWEEN ,所以上面的LINQ不是很友好。 因此,我简化为以下内容: SELECT * FROM [ZIPMASTER] zm WHERE zm.CORP = 12 AND zm.ZIPBEG = ‘85546 ‘ 我用它来创建以下LINQ查询: var zipLinqQuery = from z in db.ZIPMASTERs where z.CORP == 12 && z.ZIPBEG = “85546 […]