我很确定我已经在某个地方看到了这个问题的答案,但是由于我在SO或谷歌上搜索了几次,我无论如何都要问它...
在Entity Framework中,删除数据对象的唯一方法似乎是
MyEntityModel ent = new MyEntityModel();
ent.DeleteObject(theObjectToDelete);
ent.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
但是,这种方法需要首先将对象加载到Controller,只是为了删除它.有没有办法删除仅引用其ID的业务对象?
如果使用Linq或Lambda表达式有更聪明的方法,那也没关系.但主要目的是避免加载数据只是为了删除它.
我有一个应用程序,允许用户输入他们工作的时间,我正在尝试为此构建一个良好的报告,利用LINQ to Entities.因为每个TrackedTime都TargetDate只是a的"Date"部分DateTime,所以按用户和日期对时间进行分组相对简单(为简单起见,我省略了"where"子句):
var userTimes = from t in context.TrackedTimes
group t by new {t.User.UserName, t.TargetDate} into ut
select new
{
UserName = ut.Key.UserName,
TargetDate = ut.Key.TargetDate,
Minutes = ut.Sum(t => t.Minutes)
};
Run Code Online (Sandbox Code Playgroud)
由于该DateTime.Month属性,按用户分组和Month只是稍微复杂一点:
var userTimes = from t in context.TrackedTimes
group t by new {t.User.UserName, t.TargetDate.Month} into ut
select new
{
UserName = ut.Key.UserName,
MonthNumber = ut.Key.Month,
Minutes = ut.Sum(t => t.Minutes)
};
Run Code Online (Sandbox Code Playgroud)
现在是棘手的部分.是否有可靠的方式按周分组?我根据对类似LINQ to SQL问题的响应尝试了以下内容:
DateTime firstDay = …Run Code Online (Sandbox Code Playgroud) 我正在创建一个创建一个搜索数据库的应用程序,并允许用户动态添加任何标准(大约50种可能),非常类似于以下SO问题:使用实体框架创建动态查询.我目前正在进行搜索,检查每个条件,如果它不是空白,则将其添加到查询中.
C#
var query = Db.Names.AsQueryable();
if (!string.IsNullOrWhiteSpace(first))
query = query.Where(q => q.first.Contains(first));
if (!string.IsNullOrWhiteSpace(last))
query = query.Where(q => q.last.Contains(last));
//.. around 50 additional criteria
return query.ToList();
Run Code Online (Sandbox Code Playgroud)
此代码在sql server中生成类似于以下内容的东西(为了便于理解,我进行了简化)
SQL
SELECT
[Id],
[FirstName],
[LastName],
...etc
FROM [dbo].[Names]
WHERE [FirstName] LIKE '%first%'
AND [LastName] LIKE '%last%'
Run Code Online (Sandbox Code Playgroud)
我现在尝试添加一种方法,通过实体框架使用C#生成以下SQL,但使用OR而不是AND,同时仍然保持动态添加条件的能力.
SQL
SELECT
[Id],
[FirstName],
[LastName],
...etc
FROM [dbo].[Names]
WHERE [FirstName] LIKE '%first%'
OR [LastName] LIKE '%last%' <-- NOTICE THE "OR"
Run Code Online (Sandbox Code Playgroud)
通常,条件不会大于查询的两个或三个项目,但将它们组合成一个巨大的查询不是一种选择.我尝试过concat,union和intersect,他们只是复制查询并将它们与UNION连接起来.
是否有一种简单而干净的方法可以使用实体框架向动态生成的查询添加"OR"条件?
使用我的解决方案进行编辑 - 2015年9月29日
自发布以来,我注意到这已经得到了一点关注,所以我决定发布我的解决方案
// Make …Run Code Online (Sandbox Code Playgroud) 如何以随机顺序返回匹配的实体?
要明确这是Entity Framework的东西和LINQ to Entities.
(航空代码)
IEnumerable<MyEntity> results = from en in context.MyEntity
where en.type == myTypeVar
orderby ?????
select en;
Run Code Online (Sandbox Code Playgroud)
谢谢
编辑:
我尝试将其添加到上下文中:
public Guid Random()
{
return new Guid();
}
Run Code Online (Sandbox Code Playgroud)
并使用此查询:
IEnumerable<MyEntity> results = from en in context.MyEntity
where en.type == myTypeVar
orderby context.Random()
select en;
Run Code Online (Sandbox Code Playgroud)
但我得到了这个错误:
System.NotSupportedException: LINQ to Entities does not recognize the method 'System.Guid Random()' method, and this method cannot be translated into a store expression..
Run Code Online (Sandbox Code Playgroud)
编辑(当前代码):
IEnumerable<MyEntity> results = (from en in context.MyEntity
where …Run Code Online (Sandbox Code Playgroud) 我找不到任何关于如何使用Linq to Entities进行批量/批量插入的示例.你们知道如何进行批量插入吗?
关于LINQ和多个连接的帖子很多.但是,我没有找到任何我想要加入的解决方案.
SQL等价物将是这样的:
SELECT * FROM table1 a
LEFT JOIN table2 b ON a.col1 = b.key1 AND
a.col2 = b.key2 AND
b.from_date <= now() AND
b.deleted = 0;
Run Code Online (Sandbox Code Playgroud)
这是我尝试过的众多linq查询之一
var query = (from x in context.table1
join y in context.table2 on new {x.col1, x.col2} equals {b.key1, b.key2}
into result
from result......
Run Code Online (Sandbox Code Playgroud)
我怎样才能添加日期和删除标志的附加条件?如果我使用.Where条件,则将其视为内连接,而不是左连接.
我尝试在当前日期的60天30天20天内选择数据库中的记录.
请在下面查看此查询.
var uploads = (
from files in _fileuploadRepository.Table
join product in _productRepository.Table on files.Event equals product.Id
where
(
product.EventDate != null &&
(product.EventDate.Subtract(DateTime.Now).Days <= 60 && product.EventDate.Subtract(DateTime.Now).Days >= 60) ||
(product.EventDate.Subtract(DateTime.Now).Days <= 30 && product.EventDate.Subtract(DateTime.Now).Days >= 30) ||
(product.EventDate.Subtract(DateTime.Now).Days <= 20 && product.EventDate.Subtract(DateTime.Now).Days >= 20))
&&
files.IsSkiped == false
select files;
).ToList();
Run Code Online (Sandbox Code Playgroud)
但是此查询发生错误.

我很无能为力.请帮忙.
我很难理解如何映射某些对象.请回答一些关于这个简单示例的问题.
示例代码
class User
{
private int id;
private string name;
}
class Group
{
private int id;
private string name;
private List<User> users;
}
[DataContract]
public class UserDto
{
[DataMember]
public int id { get; set; }
[DataMember]
public string name{ get; set; }
}
[DataContract]
public class GroupDto
{
[DataMember]
public int id { get; set; }
[DataMember]
public string name{ get; set; }
[DataMember]
public List<User> Users { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
地图集
Mapper.CreateMap<User, UserDto>();
Mapper.CreateMap<UserDto, User>(); …Run Code Online (Sandbox Code Playgroud) 我正在使用LINQ语句,从各种表中选择我需要填写一些帖子/帖子后评论样式记录的信息.我得到一个有趣的例外,当我尝试迭代记录集时,该对象必须实现IConvertible.关于它的有趣部分是它似乎只发生在我用来保存数据的匿名类型包含2个以上的泛型集合时.
//select friend timeline posts posts
var pquery = from friend in fquery
join post in db.game_timeline on friend.id equals post.user_id
//join user in db.users on post.friend_id equals user.id into userGroup
//join game in db.games on post.game_id equals game.game_id into gameGroup
select new
{
Friend = friend,
Post = post,
Game = from game in db.games
where game.game_id == post.game_id
select game,
Recipient = from user in db.users
where user.id == post.user_id
select user,
Comments = from comment in db.timeline_comments …Run Code Online (Sandbox Code Playgroud) 我使用Entity Framework(v6.1.1)执行以下LINQ查询:
private IList<Customer> GetFullCustomers(IEnumerable<int> customersIds)
{
IQueryable<Customer> fullCustomerQuery = GetFullQuery();
return fullCustomerQuery.Where(c => customersIds.Contains(c.Id)).ToList();
}
Run Code Online (Sandbox Code Playgroud)
这个查询被翻译成相当不错的SQL:
SELECT
[Extent1].[Id] AS [Id],
[Extent1].[FirstName] AS [FirstName]
-- ...
FROM [dbo].[Customer] AS [Extent1]
WHERE [Extent1].[Id] IN (1, 2, 3, 5)
Run Code Online (Sandbox Code Playgroud)
但是,我在查询编译阶段获得了非常显着的性能影响.呼叫:
ELinqQueryState.GetExecutionPlan(MergeOption? forMergeOption)
Run Code Online (Sandbox Code Playgroud)
占用每个请求约50%的时间.深入研究,结果是每次我传递不同的customersIds时都会重新编译查询.根据MSDN文章,这是一个正常现象,因为IEnumerable的是在查询中使用被认为是挥发性的,并且是缓存的SQL的一部分.这就是为什么SQL对于customersIds的每个不同组合都是不同的,并且它总是具有用于从缓存中获取编译查询的不同哈希.
现在问题是:如何在仍然查询多个customersIds时避免重新编译?
linq-to-entities ×10
c# ×7
linq ×6
asp.net-mvc ×2
.net ×1
automapper ×1
linq-to-sql ×1
mysql ×1
performance ×1
sql-server ×1
wcf ×1