내가 LINQ 매우 새로운 오전과 같은 수행하는 방법을 알아 내려고 노력하고 있어요 :LINQ 반사 윈폼
는 현재, 나는 그것의 멤버 중 하나로서 DataRow를 가진 자료 양식이있는 윈폼 프로젝트가 있습니다. 필자는 DataTable (SQL Query Result)의 데이터를 기반으로 DataRow를 채 웁니다. 파생 된 Forms에는 데이터의 값으로 채워지는 컨트롤이 있습니다. 파생 된 폼의 저장 단추를 클릭하면 기본 폼의 DataRow가 업데이트 된 다음 파생 된 폼이 DataAdapter를 통해 데이터베이스를 업데이트합니다.
내가 파생 양식에 내 LINQ 쿼리를 생성하고 자료의 Object로 결과를 할당 : 나는 내가 다음으로 LINQ를 사용하여이 기능을 구현하는 시도 linqs를 사용하여 SQL 명령을 모두 교체하고 싶어 형태. Base Form의 Object를 Linq 쿼리의 클래스 유형으로 캐스팅하고 리플렉션을 사용하여 파생 된 양식의 모든 컨트롤을 채 웁니다. 저장 버튼을 클릭하면 개체가 업데이트되지만 데이터베이스를 업데이트 할 수 없습니다.해결할 수없는 문제는 개체를 업데이트 한 후에 데이터베이스를 업데이트하는 방법입니다. 이 시점에서 나는 linq 쿼리에 사용 된 데이터 컨텍스트가 없습니다.
linq 쿼리에서 SQL 함수를 사용하므로 익명 형식 오류가 발생하면서이 값에 대해 별도의 클래스를 만들어야했습니다. 아마도 여기에 뭔가 빠져있을 것입니다.
나는 정말 linq 코드가 얼마나 깨끗한 지 알고 싶습니다. (토마스의 대답에 브래드의 편집에서 복사)
편집 : 여기
내 코드의 3 단계입니다.
1 단계은 - 데이터베이스
private void GetDatabaseDetailData()
{
_db = new PriorityDataContext();
DetailData = (from db in _db.tblDatabases
where db.DatabaseID == Id
select db).SingleOrDefault();
DeveloperData = (from db in _db.tblDatabases
where db.DatabaseID == Id
select new DeveloperInfo
{
DeveloperName = _db.func_get_employee_name(db.Developer)
}).SingleOrDefault();
}
2 단계에서 데이터의 그을음 레코드를 가져 - 이름이 객체에 존재 whos는 모든 컨트롤을 채 웁니다. DetailData 오브젝트는,이 메소드에게 건네진 특정의 형태에 캐스트됩니다. 간결함을 위해 모든 코드가 표시되지 않았습니다.
protected virtual void PopulateDetailControlsA(List<Control> controlContainers, string srcDataTableName)
{
Object data = null;
Type type = null;
switch (srcDataTableName)
{
case "tblDatabases" :
type = typeof(tblDatabase);
data = (tblDatabase)DetailData;
break;
}
if (type != null)
{
var properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance);
foreach (var controlContainer in controlContainers)
{
foreach (var propertyInfo in properties)
{
if (!ControlExists(controlContainer, propertyInfo.Name)) continue;
var txtControl = controlContainer.Controls[propertyInfo.Name] as ExtendedTextBox;
if (txtControl != null)
{
try
{
var value = propertyInfo.GetValue(data, null).ToString();
if (propertyInfo.Name == "row_oper_name" || propertyInfo.Name == "row_last_chng_oper_name")
{
txtControl.Text = RowOperatorData.RowOperatorName;
txtControl.ValueMember = propertyInfo.GetValue(data, null).ToString();
}
else
txtControl.Text = value;
}
catch (NullReferenceException)
{
}
continue;...........
3 단계 - 시도하고에서 파생 다시 데이터베이스에 변경 사항을 저장합니다. 내가 듣고 정말 불분명하고있는 무슨
private void SaveData()
{
try
{
_db.SubmitChanges();
}
catch (Exception sqlException)
{
}
}
내가 여러 쿼리에 동일한 코드를 사용할 수 있도록 기본 양식에서 설정 한 결과를 저장하는 방법입니다. DataRow는 25 개 이상의 Forms에 대해 일부 코드를 사용했기 때문에 효과적이었습니다.
LINQtoSQL을 사용하지 않는 이유는 무엇입니까? 여기에는 이미 모든 유용한 메소드가 있습니다. DataContext에서 SubmitChanges()를 호출 할 수 있습니다. http://msdn.microsoft.com/en-us/library/system.data.linq.datacontext.aspx – Bazzz
예, LinqtoSQL을 사용하고 있으며 모든 기능이 정상적으로 작동합니다. 내 문제는이 시점에서 쿼리 결과를 가져 오는 데 사용 된 원래 DataContext가 없기 때문에 기본 폼의 데이터베이스에서 데이터베이스를 업데이트하는 방법을 모르겠다는 것입니다. 파생 된 폼의 멤버로 DataContext를 넣으려고했지만 작동하지 않습니다. – Brad
귀하의 질문에 대한 Tomas의 답변을 편집했습니다. – Brian