Tag: linq to entities

如何从较小的可重复使用的查询中编写entity framework查询?

我在我的应用程序中有一些(相当多余的)查询,如下所示: var last30Days = DateTime.Today.AddDays(-30); from b in Building let issueSeverity = (from u in Users where u.Building == b from i in u.Issues where i.Date > last30Days select i.Severity).Max() select new { Building = b, IssueSeverity = issueSeverity } 和: var last30Days = DateTime.Today.AddDays(-30); from c in Countries let issueSeverity = (from u in […]

如何在使用LINQ to Entities和帮助方法时保持DRY?

让我们说我有一种特殊的方法来决定某些字符串是否“匹配”,如下所示: public bool stringsMatch(string searchFor, string searchIn) { if (string.IsNullOrEmpty(searchFor)) { return true; } return searchIn != null && (searchIn.Trim().ToLower().StartsWith(searchFor.Trim().ToLower()) || searchIn.Contains(” ” + searchFor)); } 我想使用Linq To Entities和这个帮助器从数据库中提取匹配项。 但是,当我尝试这个: IQueryable blahs = query.Where(b => stringsMatch(searchText, b.Name); 我得到“LINQ to Entities无法识别方法……” 如果我重新编写代码: IQueryable blahs = query.Where(b => string.IsNullOrEmpty(searchText) || (b.Name != null && (b.Name.Trim().ToLower().StartsWith(searchText.Trim().ToLower()) || b.Name.Contains(” […]

在LINQ to Entities(EF4.1)中返回具有类型约束的generics的输入类型

我有一个简单的扩展方法,用于按标签过滤LINQ IQueryable。 我正在使用LINQ to Entities,接口为: public interface ITaggable { ICollection Tags { get; } } 以下不起作用,返回IQueryable而不是IQueryable : public static IQueryable WhereTagged(this IQueryable set, string tag) where T:ITaggable { return set.Where(s=>s.Tags.Any(t=>t.Name.ToLower() == tag.ToLower())); } 这导致LINQ to Entities强制转换exception: “无法将类型’ReleaseGateway.Models.Product’转换为’ReleaseGateway.Models.ITaggable’.LINQ to Entities仅支持转换实体数据模型基元类型。” (System.NotSupportedException)捕获到System.NotSupportedException:“无法将类型’Project.Models.Product’强制转换为’Project.Models.ITaggable’.LINQ to Entities仅支持转换实体数据模型基元类型。” 它没有像这样的约束,但我必须在我的应用程序代码中显式声明类型T: public static IQueryable WhereTagged(this IQueryable set, string tag) { return set.Where(s=>s.Tags.Any(t=>t.Name.ToLower() == […]

如何使用LINQ选择对象?

我的数据看起来像这样: UserId | SongId ——– ——– 1 1 1 4 1 12 2 95 我也有以下课程: class SongsForUser { public int User; public List Songs; } 我想要做的是使用LINQ从我的数据中选择以创建SongsForUser对象的集合。 以下是我到目前为止所提出的: var userCombos = songs.UserSongs.Select(x => new SongsForUser() { User = x.UserId, Songs = /*What goes here?*/ }); 我如何填写我的Songs列表? 所以结果应该是两个SongsForUser对象。 对于用户1 ,它将在Songs列表中有3个项目。 对于用户2 ,它将在Songs列表中有1个项目。

是否有可能让Entity Framework识别已创建但尚未保存在数据库中的对象?

Say Table1是一个包含两列的表。 Table1ID和名称。 如果我执行以下代码… var Obj1 = new Table1(); Obj1.Name = “hello” TestDBEntities.AddToTable1(Obj1); var currObj = Table1.Where(o => o.Name.Contains(“hello”)).FirstOrDefault(); currObj将返回null。 但是,如果我这样做 var Obj1 = new Table1(); Obj1.Name = “hello” TestDBEntities.AddToTable1(Obj1); **TestDBEntitles.SaveChanges();** var currObj = Table1.Where(o => o.Name.Contains(“hello”)).FirstOrDefault(); 然后currObj将返回我创建的第一个对象。 这是因为该对象在数据库中。 我正在创建一个大批量进程,我不希望将所有内容保存到数据库直到最后。 但是,我必须进行检查,例如确保某个对象尚未添加等,这需要我在将这些对象保存到数据库之前引用它们。 是否可以在Entity Framework中进行LINQ查询,该查询可以识别内存中尚未保存到数据库的对象。

Linq to Entities SqlFunctions.DateDiff不受支持

我有以下代码 DateTime now = DateTime.UtcNow; var allItemsOver64 = _inventoryContext.Items.Where(i => (SqlFunctions.DateDiff(“dd”, i.PrimaryInsured.DoB, now) / 365.0) >= 65); IQueryable items65To69 = allItemsOver64.Where(i => (SqlFunctions.DateDiff(“dd”, i.PrimaryInsured.DoB, now) / 365.0) >= 65 && (SqlFunctions.DateDiff(“dd”, i.PrimaryInsured.DoB, now) / 365.0) <= 69); 但是当我尝试使用allItemsOver64因此Items65To69.Count()时,我得到了这个错误 表达式((((转换(DateDiff(“dd”,[10007] .PrimaryInsured.DoB,26/04/2012 15:03:09))/ 365)> = 65)和((转换(DateDiff(“dd) “,[10007] .PrimaryInsured.DoB,26/04/2012 15:03:09))/ 365)> = 65))和((转换(DateDiff(”dd“,[10007] .PrimaryInsured.DoB,26 / 04/2012 15:03:09))/ 365)<= […]

从表达式创建动态Linq select子句

假设我已经定义了以下变量: IQueryable myQueryable; Dictionary<string, Expression<Func>> extraFields; // the dictionary is keyed by a field name 现在,我想将一些动态字段添加到IQueryable中,以便返回IQueryable ,其中ExtendedMyClass定义为: class ExtendedMyClass { public MyClass MyObject {get; set;} public IEnumerable ExtraFieldValues {get; set;} } class StringAndBool { public string FieldName {get; set;} public bool IsTrue {get; set;} } 换句话说,对于extraFields每个值,我想在ExtendedMyClass.ExtraFieldValues有一个值,表示该表达式是否为该行的计算结果为True。 我有一种感觉,这应该在动态的Linq和LinqKit中可行,尽管我之前从未认真对待过。 我也对其他建议持开放态度,特别是如果这可以通过良好的“powershell型Linq”来完成。 我正在使用Linq to Entities,因此查询需要转换为SQL。

如何以类型安全的方式编写具有列名作为参数的LINQ查询

我正在寻求有关如何使用LINQ以类型安全方式实现此目的的帮助。 我需要在包含许多列的“性能”表上执行搜索。 根据为搜索指定的条件,我需要选择列并对具有给定值的列执行搜索。 private static IQueryable PerformanceSearch(IQueryable investments, **??? searchColumn**, double minValue, double maxValue) { var entity = ExtendedEntities.Current; investments = from inv in entity.Investments join performance in entity.Performances on inv.InvestmentID equals perfromance.InvestmentID where **performance.searchColumn** >= minValue && **performance.searchColumn** = maxValue return investments; } 现在我正在寻求你的帮助: 如何以类型安全的方式将列“searchColumn”传递给此方法? 我正在考虑创建一个字典对象,以适应某种方式来维护entity framework中的列名。 但不知道如何实现这一目标。 如何使用传递的columnName和应用where子句来执行LINQ查询。 我不能使用If Else或Switch案例如下所示是可能的搜索列表… /* * Search […]

7秒的EF启动时间,即使对于微小的DbContext也是如此

我正在尝试减少基于EF的应用程序的启动时间,但我发现即使对于单实体上下文,我也无法将初始读取所花费的时间减少到7秒以下。 特别奇怪的是,这个时间不是特定于上下文类型的。 任何人都可以解释是什么导致这些缓慢的时间和/或我如何让事情更快地运行? 这是完整的示例代码: 在我的数据库中,我有一个名为se_stores的表,其主键列为AptId: // a sample entity class public class Apartment { public int AptId { get; set; } } // two identical DbContexts public class MyDbContext1 : DbContext { public MyDbContext1(string connectionString) : base(connectionString) { } protected override void OnModelCreating(DbModelBuilder modelBuilder) { Database.SetInitializer(null); var config = new EntityTypeConfiguration(); config.HasKey(a => a.AptId).ToTable(“se_stores”); modelBuilder.Configurations.Add(config); […]

LINQ to Entities / LINQ to SQL:在查询理解过程中从服务器(可查询)切换到客户端(可枚举)?

在许多情况下,我想在服务器端进行一些过滤(有时是投影),然后切换到客户端,以获取LINQ提供程序本身不支持的操作。 天真的方法(基本上就是我现在所做的)就是把它分解成多个查询,类似于: var fromServer = from t in context.Table where t.Col1 = 123 where t.Col2 = “blah” select t; var clientSide = from t in fromServer.AsEnumerable() where t.Col3.Split(‘/’).Last() == “whatever” select t.Col4; 然而,有很多次这是更多的代码/麻烦,而不是真正的价值。 我真的很想在中间做一个“切换到客户端”。 我已经尝试了各种使用查询延续的方法,但是在第一个查询结束时执行’select t into foo’之后,foo仍然是一个单独的项目,而不是集合,所以我不能AsEnumerable()它。 我的目标是能够写出更像: var results = from t in context.Table where t.Col1 = 123 where t.Col2 = “blah” // […]