string.Join 在实体框架中,LINQ to SQL。没有客户端评估
string.Join in Entity framwork, LINQ to SQL. Without Client-side evaluation
如果你有table,类似于here:
DataTypeID, DataValue
1,"Value1"
1,"Value2"
2,"Value3"
3,"Value4"
并想要这样的输出:
DataTypeID,DataValues
1,"Value1,Value2"
2,"Value3"
3,"Value4"
大多数问题建议 使用 toList() 或 AsEnumerable(),然后 string.Join(", ", DataValues) 在客户端。如果数据不是很大,这可能会奏效,但它违背了使用 EF 的目的。如何在不加载内存中的所有数据的情况下执行此操作?
好吧,根据这个 this issue,string.Join() 尚未实施(截至目前)并且 IEnumerable.Aggregate 也不会翻译。
与此同时,您可以创建一个视图并在其中写入您的SQL。
例如,按 id 和 string.Join(", ", Names);
分组
CREATE VIEW V_Name AS
SELECT ID,
Names=STUFF
(
(
SELECT DISTINCT ' || '+ CAST(Child.Name AS VARCHAR(MAX))
FROM Child,MainTable
WHERE Main.ID= t1.ID --this line is imp...
AND Child.ID=MainTable.ID
FOR XMl PATH('')
),1,1,''
)
FROM MainTable t1
GROUP BY t1.IDReview
或
CREATE VIEW V_Name AS
SELECT ID, STRING_AGG(Name, ', ') AS Names
FROM MainTable
LEFT JOIN ChildTable ON MainTable.ID = ChildTable.ID
GROUP BY ID
现在,在您的 C# 中,您可以简单地将其与您的 ID 连接起来,就像您通常使用 IQueryable 一样:
from data in _dbcontext.sometable
join groupedAndJoinedNames in _dbcontext.viewname
on data.ID equals groupedAndJoinedNames.ID
select new
{
Names = groupedAndJoinedNames.Names
}
如果你有table,类似于here:
DataTypeID, DataValue
1,"Value1"
1,"Value2"
2,"Value3"
3,"Value4"
并想要这样的输出:
DataTypeID,DataValues
1,"Value1,Value2"
2,"Value3"
3,"Value4"
大多数问题建议
好吧,根据这个 this issue,string.Join() 尚未实施(截至目前)并且 IEnumerable.Aggregate 也不会翻译。
与此同时,您可以创建一个视图并在其中写入您的SQL。
例如,按 id 和 string.Join(", ", Names);
CREATE VIEW V_Name AS
SELECT ID,
Names=STUFF
(
(
SELECT DISTINCT ' || '+ CAST(Child.Name AS VARCHAR(MAX))
FROM Child,MainTable
WHERE Main.ID= t1.ID --this line is imp...
AND Child.ID=MainTable.ID
FOR XMl PATH('')
),1,1,''
)
FROM MainTable t1
GROUP BY t1.IDReview
或
CREATE VIEW V_Name AS
SELECT ID, STRING_AGG(Name, ', ') AS Names
FROM MainTable
LEFT JOIN ChildTable ON MainTable.ID = ChildTable.ID
GROUP BY ID
现在,在您的 C# 中,您可以简单地将其与您的 ID 连接起来,就像您通常使用 IQueryable 一样:
from data in _dbcontext.sometable
join groupedAndJoinedNames in _dbcontext.viewname
on data.ID equals groupedAndJoinedNames.ID
select new
{
Names = groupedAndJoinedNames.Names
}