首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >实体框架拼接LINQ to Entity查询

实体框架拼接LINQ to Entity查询
EN

Stack Overflow用户
提问于 2013-05-17 23:19:33
回答 2查看 94关注 0票数 0

我需要一些帮助。我正在尝试使EF查询的一部分可重用。

代码语言:javascript
运行
复制
var query = from sr in SomeEFRepository.SelectAll()
            select new {
               KeyValuePivotField1 = (from kvd in sr.KeyValueData
                                      where kvd.KeyName == "FieldName1"
                                      select kvd.Value).FirstOrDefault(),
               KeyValuePivotField2 = (from kvd in sr.KeyValueData
                                      where kvd.KeyName == "FieldName2"
                                      select kvd.Value).FirstOrDefault(),
               KeyValuePivotField3 = (from kvd in sr.KeyValueData
                                      where kvd.KeyName == "FieldName3"
                                      select kvd.Value).FirstOrDefault()
            }

如果你看一下,你会发现我一直在用下面的代码重复我自己。

代码语言:javascript
运行
复制
(from kvd in sr.KeyValueData
where kvd.KeyName == "SomeFieldName"
select kvd.Value).FirstOrDefault(),

为了做这样的事情,我如何创建一个EF能够识别的方法?

代码语言:javascript
运行
复制
var query = from sr in SomeEFRepository.SelectAll()
            select new {
               KeyValuePivotField1 = GetFieldFromKeyValue("FieldName1"),
               KeyValuePivotField2 = GetFieldFromKeyValue("FieldName2"),
               KeyValuePivotField3 = GetFieldFromKeyValue("FieldName3"),
            }

任何建议都会有所帮助。我一直在读表达式树,但我不确定这是不是一个好的方法,或者甚至是可能的。

注意:我使用的是带有DBContext的EF 5.0。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-24 04:27:01

我找到了一个很好的答案和文章来解决我的问题。

http://www.codeproject.com/Articles/402594/Black-Art-LINQ-expressions-reuse

一个很好的NuGet包LinqExpressionProjection 1.0.0,非常适合解决我的问题。

http://nuget.org/packages/LinqExpressionProjection

票数 0
EN

Stack Overflow用户

发布于 2013-05-18 04:37:02

扩展方法似乎很适合这一点。我不知道你到底在做什么,所以这是一个例子

客户类

代码语言:javascript
运行
复制
public class Customer{
   public int Id { get; set; }
   public string FirstName { get; set; }
   public string LastName { get; set; }

   public override string ToString()
   {
       return string.Format("Customer is {0} {1}", this.FirstName, this.LastName);
   }
}

CustomerExtensionMethod

代码语言:javascript
运行
复制
//Class MUST be static
public static class CustomerExtensionMethods
{
    //Method MUST be static and use this keyword to be an extension method
    public static Customer GetByFirstName(this IEnumerable<Customer> source, string value)
    {
        return source.Where(c => c.FirstName == value).FirstOrDefault();
    }
}

显示其工作原理的主程序

代码语言:javascript
运行
复制
var customers = new List<Customer>
{
    new Customer { Id = 1, FirstName = "Foo", LastName = "Bar" },
    new Customer { Id = 2, FirstName = "Mark", LastName = "Whoknows" },
    new Customer { Id = 3, FirstName = "Ronald", LastName = "McDonald" },
};

var userWithFirstNameOfRonald = customers.GetByFirstName("Ronald");

Console.WriteLine(userWithFirstNameOfRonald.ToString());

这应该打印"Customer Is Ronald McDonald“。对其中的重要部分进行了评述。包含该方法的类应该是静态的,并且该方法需要是静态的。除此之外,该方法的第一个参数需要为this,以表明它是一个扩展方法。这将允许您在为第一个参数设置的特定类型上调用它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16612618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档