ASP.NET 3.5 C#
我正在使用Linq加入两张桌子
表名是MapAssets和ExitPoint
在数据库中,它们与“有关系”
我正在BLL中编写一个函数来返回连接表
public List<ExitPoints> GetExitPointDetailsByProjectID(int iProjectID)
{
ctx = new CoreDBDataContext();
var exitPointDetails = from ma in ctx.MapAssets
join ep in ctx.ExitPoints
on ma.MapAssetID equals ep.MapAssetID
where ma.ProjectID == iProjectID
select new
{
//would like to have data from both tables here
ctx.MapAssets,
ctx.ExitPoints
};
return exitPointDetails.ToList();
}
这显然不起作用。我根本不知道要归还什么 我对返回的所有约束都是能够绑定到gridview 这是正确的方法吗?或者是正确的方式?
答案 0 :(得分:6)
你不能或者更好,唯一的方法是将它们装回List
object
中,但这会使事情变得非常复杂,因为你无法将它们转换为任何类型(当然这是匿名的)你只能通过反思来访问他们的财产....
在这种情况下,我强烈建议您创建一个自定义类。
修改强>
旁注......
如果您使用的是.net 4,事情会更容易,因为您可以返回dynamic
Type而不是object
(请查看此link以查看dynamic
的简化),但无论如何,我更愿意创建一个自定义类。
答案 1 :(得分:2)
看看如何从Method返回匿名类型。
http://forums.asp.net/t/1387455.aspx
从链接中复制代码。
object ReturnAnonymous()
{
return new { Name="Faisal", City="Chakwal" };
}
// Application entry-point
void Main()
{
object o = ReturnAnonymous();
// This call to 'Cast' method converts first parameter (object) to the
// same type as the type of second parameter - which is in this case
// anonymous type with 'Name' and 'City' properties
var typed = Cast(o, new { Name="", City="" });
Console.WriteLine("Name={0}, City={1}", typed.Name, typed.City);
}
// Cast method - thanks to type inference when calling methods it
// is possible to cast object to type without knowing the type name
T Cast<T>(object obj, T type)
{
return (T)obj;
}
您可以使用下面提到的方法返回List和
List<object> lstAnonymousTypes = GetExitPointDetailsByProjectID(1);
foreach(object o in lstAnonymousTypes)
{
//Change it accordingly
var typed = Cast(o, new { new MapAssets() , new ExitPoints() });
}
希望这有助于不尝试。
答案 2 :(得分:1)
您不能返回匿名类型,您只能在其所在方法的范围内使用匿名类型。您可能需要使用MapAssets / ExitPoints属性创建一个新类,并选择该类的新实例。
答案 3 :(得分:1)
您正在尝试返回List ExitPoints和MapAssets列表,这是不可能的,因为您从两个表获取输出,即ExitPoints和MapAssets。而且也无法返回匿名类型。因此,为了重新启动查询,请创建一个类名ExMapClass,其中包含您作为查询输出所需的属性。现在执行你编写的linq查询后迭代它,即
创建新创建的类列表
列出newclass = new list();
foreach(在ctx中的var结果) {
实例化创建的类</ p>
obj.Property1 = var.MapAssets;
obj.Property2 = var.ExitPoints;
newclass.add(OBJ);
}
现在重新开始新创建的类列表。
希望你明白了。答案 4 :(得分:1)
创建它之后是否必须绑定到此对象?如果没有,那么您可以创建一个“持久性AnonymousType”类,该类将值存储在字典中,并使用以下方法返回属性值:
string lastName AnonType.GetValue<string>("LastName");
int age AnonType.GetValue<int>("Age");
以下是指向excellent example的链接。作者还有一个example where he creates the "AnonymousType" from a datatable.
我使用以下语法处理了此where I provide the ability to query“AnonymousType”列表的变体:
//这是查询 var dept13 = anonAgents.AsQueryable() .Where(x =&gt; x.Has(“Department”,Compare.Equal,13);
//以下是List的构建方式
private static AnonymousType ProvisionAgent(string name, int department)
{
return AnonymousType.Create(new
{
Name = name,
Department = department
});
}
private List<AnonymousType> CreateAnonAgentList()
{
var anonAgents = new List<AnonymousType>();
// Dave and Cal are in Department 13
anonAgents.Add(AnonymousType.Create(CreateAgentAnonType("Dan Jacobs", 13, 44)));
anonAgents.Add(AnonymousType.Create(CreateAgentAnonType("Calvin Jones", 13, 60)));
// Leasing = Dept 45
anonAgents.Add(AnonymousType.Create(CreateAgentAnonType("Stanley Schmidt", 45, 36)));
anonAgents.Add(AnonymousType.Create(CreateAgentAnonType("Jeff Piper", 45, 32)));
anonAgents.Add(AnonymousType.Create(CreateAgentAnonType("Stewart Blum", 45, 41)));
anonAgents.Add(AnonymousType.Create(CreateAgentAnonType("Stuart Green", 45, 38)));
// HR = Dept 21
anonAgents.Add(AnonymousType.Create(CreateAgentAnonType("Brian Perth", 21, 25)));
anonAgents.Add(AnonymousType.Create(CreateAgentAnonType("Katherine McDonnel", 21, 23)));
return anonAgents;
}
答案 5 :(得分:0)
只需使用和ArrayList
public static ArrayList GetMembersItems(string ProjectGuid)
{
ArrayList items = new ArrayList();
items.AddRange(yourVariable
.Where(p => p.yourProperty == something)
.ToList());
return items;
}
答案 6 :(得分:-2)
不会这样做吗?
ctx = new CoreDBDataContext();
var exitPointDetails = from ma in ctx.MapAssets
join ep in ctx.ExitPoints
on ma.MapAssetID equals ep.MapAssetID
where ma.ProjectID == iProjectID
select Tuple.Create(ma, ep);
return exitPointDetails.ToList();